home *** CD-ROM | disk | FTP | other *** search
/ Mac Easy 2010 May / Mac Life Ubuntu.iso / casper / filesystem.squashfs / usr / lib / python2.6 / lib2to3 / fixes / fix_dict.pyc (.txt) < prev    next >
Encoding:
Python Compiled Bytecode  |  2009-04-20  |  3.5 KB  |  84 lines

  1. # Source Generated with Decompyle++
  2. # File: in.pyc (Python 2.6)
  3.  
  4. """Fixer for dict methods.
  5.  
  6. d.keys() -> list(d.keys())
  7. d.items() -> list(d.items())
  8. d.values() -> list(d.values())
  9.  
  10. d.iterkeys() -> iter(d.keys())
  11. d.iteritems() -> iter(d.items())
  12. d.itervalues() -> iter(d.values())
  13.  
  14. Except in certain very specific contexts: the iter() can be dropped
  15. when the context is list(), sorted(), iter() or for...in; the list()
  16. can be dropped when the context is list() or sorted() (but not iter()
  17. or for...in!). Special contexts that apply to both: list(), sorted(), tuple()
  18. set(), any(), all(), sum().
  19.  
  20. Note: iter(d.keys()) could be written as iter(d) but since the
  21. original d.iterkeys() was also redundant we don't fix this.  And there
  22. are (rare) contexts where it makes a difference (e.g. when passing it
  23. as an argument to a function that introspects the argument).
  24. """
  25. from  import pytree
  26. from  import patcomp
  27. from pgen2 import token
  28. from  import fixer_base
  29. from fixer_util import Name, Call, LParen, RParen, ArgList, Dot
  30. from  import fixer_util
  31. iter_exempt = fixer_util.consuming_calls | set([
  32.     'iter'])
  33.  
  34. class FixDict(fixer_base.BaseFix):
  35.     PATTERN = "\n    power< head=any+\n         trailer< '.' method=('keys'|'items'|'values'|\n                              'iterkeys'|'iteritems'|'itervalues') >\n         parens=trailer< '(' ')' >\n         tail=any*\n    >\n    "
  36.     
  37.     def transform(self, node, results):
  38.         head = results['head']
  39.         method = results['method'][0]
  40.         tail = results['tail']
  41.         syms = self.syms
  42.         method_name = method.value
  43.         isiter = method_name.startswith('iter')
  44.         if isiter:
  45.             method_name = method_name[4:]
  46.         
  47.         if not method_name in ('keys', 'items', 'values'):
  48.             raise AssertionError, repr(method)
  49.         head = [ n.clone() for n in head ]
  50.         tail = [ n.clone() for n in tail ]
  51.         if not tail:
  52.             pass
  53.         special = self.in_special_context(node, isiter)
  54.         args = head + [
  55.             pytree.Node(syms.trailer, [
  56.                 Dot(),
  57.                 Name(method_name, prefix = method.get_prefix())]),
  58.             results['parens'].clone()]
  59.         new = pytree.Node(syms.power, args)
  60.         new.set_prefix(node.get_prefix())
  61.         return new
  62.  
  63.     P1 = "power< func=NAME trailer< '(' node=any ')' > any* >"
  64.     p1 = patcomp.compile_pattern(P1)
  65.     P2 = "for_stmt< 'for' any 'in' node=any ':' any* >\n            | comp_for< 'for' any 'in' node=any any* >\n         "
  66.     p2 = patcomp.compile_pattern(P2)
  67.     
  68.     def in_special_context(self, node, isiter):
  69.         if node.parent is None:
  70.             return False
  71.         results = { }
  72.         if node.parent.parent is not None and self.p1.match(node.parent.parent, results) and results['node'] is node:
  73.             if isiter:
  74.                 return results['func'].value in iter_exempt
  75.             return results['func'].value in fixer_util.consuming_calls
  76.         results['node'] is node
  77.         if not isiter:
  78.             return False
  79.         if self.p2.match(node.parent, results):
  80.             pass
  81.         return results['node'] is node
  82.  
  83.  
  84.